package juego;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

import juego.mundo.Mapa;


@SuppressWarnings("serial")
public class PanelJuego extends JPanel{
	
	private boolean teclaIzq, teclaDch, teclaAba, teclaArr, pausado, fin;
	
	private Mapa mapa;
	
	public PanelJuego() {
		super();
		this.teclaIzq = false;
		this.teclaDch = false;
		this.teclaAba = false;
		this.teclaArr = false;
		this.pausado = false;
		this.fin = false;
		this.mapa = new Mapa();
		
		this.addKeyListener(new GestionEventosTeclado());
		setFocusable(true);
        setDoubleBuffered(true);
	}
	
	public void cargarRecursos() {
		try {
			mapa.cargarMapa("recursos"+File.separator+"mapas"+java.io.File.separator+"nivel.map");
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		mapa.setImgFondo(new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"fondo.png")));
		mapa.agregarImagen('k', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa00.png")));
		mapa.agregarImagen('n', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa01.png")));
		mapa.agregarImagen('p', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa02.png")));
		mapa.agregarImagen('o', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa03.png")));
		mapa.agregarImagen('c', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa04.png")));
		mapa.agregarImagen('a', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa06.png")));
		mapa.agregarImagen('b', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa07.png")));
		mapa.agregarImagen('d', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa08.png")));
		mapa.agregarImagen('j', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa09.png")));
		mapa.agregarImagen('m', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa10.png")));
		mapa.agregarImagen('l', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa11.png")));
		mapa.agregarImagen('i', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa12.png")));
		mapa.agregarImagen('g', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa13.png")));
		mapa.agregarImagen('h', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa14.png")));
		mapa.agregarImagen('e', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa15.png")));
		mapa.agregarImagen('f', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa16.png")));
		mapa.agregarImagen('z', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa17.png")));
		mapa.agregarImagen('q', new ImageIcon(ClassLoader.getSystemResource("recursos"+File.separator+"imagenes"+java.io.File.separator+"losa18.png")));
		mapa.inicializarMapa();
	}
	
	public void iniciarJuego() {
		cargarRecursos();
		Thread hiloJuego = new Thread() {
	         public void run() {
	            gestionarJuego();
	         }
	      };
	      hiloJuego.start();
	}
	
	public void terminarJuego() {
		fin = true;
	}
	
	public void actualizar(double dt) {
		mapa.actualizar(teclaIzq, teclaDch, teclaArr, teclaAba, dt);
	}
	
	public void paint(Graphics g) {
		super.paint(g);
		Graphics2D g2D = (Graphics2D) g;
		FontMetrics fm;
		
		mapa.paint(g2D, this.getWidth(), this.getHeight());		
		
		if (pausado) {
			g2D.setPaint(new Color(0, 0, 0, 200));
			g2D.fillRect(0, 0, this.getWidth(), this.getHeight());
			g2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
			g2D.setFont(new Font(Font.DIALOG, Font.BOLD, 20));
			g2D.setColor(new Color(200, 200, 200));
			fm = g2D.getFontMetrics();
			g2D.drawString("PAUSADO", this.getWidth() / 2 - fm.stringWidth("PAUSADO") / 2, this.getHeight() / 2);
		}
	}
	
	private void gestionarJuego() {
        
		double dt=(double)1/75;
		while(!fin){
			if (!pausado) {
				actualizar(dt);
			}
			repaint();
			try {
				Thread.sleep((long)(dt*1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
	}

	private class GestionEventosTeclado extends KeyAdapter {
		
		public void keyPressed(KeyEvent e) {
            switch (e.getKeyCode()) {
			case KeyEvent.VK_LEFT: mapa.getJugador().getAceleracion().setX(-1000); teclaIzq = true; break;
			case KeyEvent.VK_RIGHT: mapa.getJugador().getAceleracion().setX(1000); teclaDch = true; break;
			case KeyEvent.VK_UP: teclaArr = true; break;
			case KeyEvent.VK_DOWN: teclaAba = true; break;
			case KeyEvent.VK_P: pausado = !pausado; break;
				
			default: break;
			}
        }
		
        public void keyReleased(KeyEvent e) {
        	switch (e.getKeyCode()) {
			case KeyEvent.VK_LEFT: mapa.getJugador().getAceleracion().setX(0); teclaIzq = false; break;
			case KeyEvent.VK_RIGHT: mapa.getJugador().getAceleracion().setX(0); teclaDch = false; break;
			case KeyEvent.VK_UP: teclaArr = false; break;
			case KeyEvent.VK_DOWN: teclaAba = false; break;

			default: break;
			}
        }
    }

}
